// Format of an ELF executable file

#define ELF_MAGIC 0x464C457FU  // "\x7FELF" in little endian

//一个 ELF 二进制文件包括了一个 ELF 头，然后还有连续几个程序段的头

// File header
// ELF文件头
struct elfhdr {
  uint magic;  // must equal ELF_MAGIC
  uchar elf[12];
  ushort type;
  ushort machine;
  uint version;
  uint entry;
  uint phoff;
  uint shoff;
  uint flags;
  ushort ehsize;
  ushort phentsize;
  ushort phnum;
  ushort shentsize;
  ushort shnum;
  ushort shstrndx;
};

// Program section header
// 连续n个程序段的头，但xv6 中的程序只有一个程序段的头，其他操作系统中可能有多个
struct proghdr {
  uint type;   // 程序段的类型。
  uint off;    // 程序段在文件中的偏移量，以字节为单位。
  uint vaddr;  // 程序段在虚拟内存中的起始地址。
  uint paddr;  // 程序段在物理内存中的起始地址。在大多数现代操作系统中，这个值通常被忽略，因为它们使用虚拟内存。-----------------
  uint filesz; // 程序段在文件中的大小，以字节为单位。
  uint memsz;  // 程序段在内存中的大小，以字节为单位。这个值通常大于或等于 filesz，因为有些段在内存中可能需要更多的空间（例如，包含零初始化的段）。------------------
  uint flags;  // 程序段的属性。表示权限读写执行
  uint align;  // 程序段的对齐要求。
};

// Values for Proghdr type
#define ELF_PROG_LOAD           1

// Flag bits for Proghdr flags
#define ELF_PROG_FLAG_EXEC      1
#define ELF_PROG_FLAG_WRITE     2
#define ELF_PROG_FLAG_READ      4
